package com.rzico.account.plugin.hxBank;

import cn.hutool.core.codec.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;

/**
 * Created by icssh on 2020/9/7.
 */
public class AESUts {

    // 加密方式
    public static String KEY_ALGORITHM = "AES";
    // 数据填充方式
 //   AES 和 RSA 加解密以及 RSA 加验签的组合使用
    String algorithmStr = "AES/CBC/PKCS7Padding";
    // 避免重复 new 生成多个 BouncyCastleProvider 对象，因为 GC 回收不了，会造成内存溢出
// 只在第一次调用 decrypt()方法时才 new 对象
    public static boolean initialized = false;
    /**
     *
     * @param originalContent
     * @param encryptKey
     * @param ivByte
     * @return
     */
    public static String encrypt(byte[] originalContent, byte[] encryptKey, byte[] ivByte) {
// initialize();
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec skeySpec = new SecretKeySpec(encryptKey, "AES");
// cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(ivByte));
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, generateIV(ivByte));
            byte[] encrypted = cipher.doFinal(originalContent);
// String a=Base64.encode(encrypted);
// return new String(Base64.encode(encrypted),"utf-8");
            return Base64.encode(encrypted);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } }
    /**
     * AES 解密 填充模式 AES/CBC/PKCS7Padding 解密模式 128
     AES 和 RSA 加解密以及 RSA 加验签的组合使用
     *
     * @param content
     * 目标密文
     * @return
     * @throws Exception
     * @throws InvalidKeyException
     * @throws NoSuchProviderException
     */
    public static String decrypt(byte[] content, byte[] aesKey, byte[] ivByte) {
// initialize();
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec sKeySpec = new SecretKeySpec(aesKey, "AES");
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
            byte[] result = cipher.doFinal(content);
// return Base64.encode(result);
            return new String(result,"utf-8");
        } catch (Exception e) {
            throw new RuntimeException(e);
        } }

//    AES 和 RSA 加解密以及 RSA 加验签的组合使用
    // 生成 iv
    public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
        AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
        params.init(new IvParameterSpec(iv));
        return params;
    }
}
